package com.blueheart.Test.lang;

import java.util.Date;
import java.util.Objects;

public class ObjectTest {

    public static void main(String[] args) {
        //getClass
        Number n = 0;
        Class<? extends Number> aClass = n.getClass();

        //hashCode 和 equals
//        1.在 Java 应用程序执行期间，在对同一对象多次调用 hashCode 方法时，必须一致地返回相同的整数，前提是将对象进行 equals 比较时所用的信息没有被修改。
//        从某一应用程序的一次执行到同一应用程序的另一次执行，该整数无需保持一致。
//        2.如果根据 equals(Object) 方法，两个对象是相等的，那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
//        3.如果根据 equals(java.lang.Object) 方法，两个对象不相等，那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果
//        。但是，程序员应该意识到，为不相等的对象生成不同整数结果可以提高哈希表的性能。
        Employee e1 = new Employee();
        Employee e2 = new Employee();
        System.out.println(e1.equals(e2));
        System.out.println(e1);


    }
}


class Employee {
    private String name;
    private int salary;
    private Date hireDay;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public Date getHireDay() {
        return hireDay;
    }

    public void setHireDay(Date hireDay) {
        this.hireDay = hireDay;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Employee employee = (Employee) o;
        //如果两个对象的对象属性为null,会报空指针异常
        //return salary == employee.salary && name.equals(employee.name) && hireDay.equals(employee.hireDay);
        return salary == employee.salary && Objects.equals(name,employee.name) && Objects.equals(hireDay,employee.hireDay);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, salary, hireDay);
    }

    @Override
    public String toString() {
        return getClass().getName() +"{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", hireDay=" + hireDay +
                '}';
    }
}